import Axios from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import {downloadFile} from './index'

/**
 * axios基础URL配置
 */
let baseURL = ''

/**
 * 创建axios实例
 * 配置基础URL、跨域携带cookie、请求超时时间等参数
 */
const axios = Axios.create({
  baseURL,
    withCredentials: true,  //跨域携带cookie
  timeout: 20000 // 请求超时 20s
})

/**
 * 请求前置拦截器
 * 在发送请求之前对请求进行处理
 */
axios.interceptors.request.use(
    (config) => {
        const token = localStorage.getItem('pass')
        if (token){
            config.headers.Authorization = `Bearer ${token}`
        }
        if (!config.headers['Content-Type']) {
            config.headers['Content-Type'] = 'application/json;charset=UTF-8'
        }
        return config
    },
    (error) => {
        return Promise.reject(error)
    }
)

/**
 * 响应后置拦截器
 * 在接收到响应后对响应数据进行处理
 * 处理文件下载和错误提示逻辑
 */
axios.interceptors.response.use(
    (response) => {
        // config设置responseType为blob 处理文件下载
        if (response.data instanceof Blob) {
            return downloadFile(response);
        }

        // 处理后端返回的JSON数据
        const res = response.data
        if (typeof res === 'object' && res !== null && 'code' in res) {
            const { code, data, message } = res
            if (code === 200) {
                return data
            } else {
                // 统一处理业务错误
                switch (code) {
                    case 401:
                        handleUnauthorized()
                        break
                    case 403:
                        ElMessage.error('无权限访问')
                        break
                    default:
                        ElMessage.error(message || '请求失败')
                }
                return Promise.reject(new Error(message))
            }
        }

        // 如果不是标准格式，直接返回
        return response.data
    },
    (error) => {
        console.log(error,"error")
        if (!error.response) {
            ElMessage.error(`网络错误，请检查网络连接`)
        } else {
            const { status, data } = error.response
            const message = data?.message || error.message

            switch (status) {
                case 401:
                    handleUnauthorized()
                    break
                case 403:
                    ElMessage.error('无访问权限')
                    break
                case 404:
                    ElMessage.error('请求资源不存在')
                    break
                case 500:
                    ElMessage.error('服务器错误')
                    break
                default:
                    ElMessage.error(message || `请求失败: ${status}`)
            }
        }
        return Promise.reject(error)
    }
)

export default axios
